iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Modern Web

如何詠唱JavaScript的Math咒語系列 第 21

[Day21]-傳說中的,阿姆斯特朗炫風噴射阿姆斯特朗,砲。Math.pow()

  • 分享至 

  • xImage
  •  

今天要介紹的咒語Math.pow()相對單純

「這是一個非常古老的大砲。」

直接唸一遍就開始吧!

「寐偲,砲!」

Math.pow()

Math.pow()唸起來就像是中文某種火砲的名稱呢!但不是。在英文中要表示ab次方會說「a to the power of b」,所以pow就是指英文的power,因此而得名。

語法

Math.pow(base, exponent)

參數

  • base

    放入一個數字作為基底數

  • exponent

    放入一個數字作為指數

回傳值

它會回傳 base 的 exponent 次方,有幾個情況會回傳NaN

  • 指數為NaN
  • base 為NaN且 exponent 不為0
  • base 為±1且 exponent 為±Infinity
  • base 小於0且 exponent 不為整數。

規範

image
這個函式會將傳入的baseexponent轉成數字,最後回傳 Number::exponentiate(base, exponent),看起來又是一個不知道什麼操作,讓我們進去看看吧!
image
image
底下演算法的部分就忽略吧!我們目前只需要知道這個操作的目的:

「抽象操作—數字求冪,接收『base』跟『exponent』然後回傳一個數字,他會是 base 的 exponent 次方的近似值。」

下面的註解:

「當 base 為1-1且 exponent 為正無限大或負無限大,或base為1且 exponent 為NaN時,base ** exponent 的結果會與IEEE 754-2019不同。ECMAScript 的最初版將這個結果定為NaN,而IEEE 754後續的版本改成了1。ECMAScript 基於相容性問題,選擇保留了之前NaN的版本。」

相容性問題?

這個運算在先前的版本中結果會是NaN,有些開發者可能會利用這樣的結果來進行邏輯判斷,如果後續更改了它的結果,在這些舊版的程式中的運算就有可能朝向錯誤的邏輯分支,因此 ECMAScript 保留了舊版的行為來確保舊版的程式依舊能正常執行。

咦?啊結果看一看Math.pow()跑出了**運算子?

結果去找還真的被我找到(廢話):
image
在一般的數字操作上**也是一樣的規範,所以我們可以認定Math.pow()**在這個部分是一樣的操作(但實際上引擎要不要用一樣的方式實作還是取決他們自己),但可以注意到下面,**也能做BigInt的運算。

既然他們都做一樣的事,那該如何取捨呢?

這邊提供大家一個網站Can I use

在裡面搜尋關鍵字就能知道這個語法在各瀏覽器版本的支援程度,就能當作一個你該不該使用這個語法的根據之一。
image
image
可以看到支援Math.pow()的版本是比較多的,因為**是2016 ES7才被引入的。

也就是說在一些版本相對較舊的瀏覽器是沒有辦法使用**的,那為了確保程式能夠正常執行,使用Math.pow()是相對安全的做法!

但現今大多瀏覽器都已經支援**了,這個新的語法顯得更簡潔有力,尤其是在一連串的數學運算中,且又能做BigInt的運算,所以除非你將運行的瀏覽器實在太老舊,否則**似乎是更好的選擇。

最後來測試使用看看吧!

console.log(Math.pow(2, 3)); //8
console.log(Math.pow(-2, 3)); //-8
console.log(Math.pow(3, 0)); //1
console.log(Math.pow(1, Infinity)); //NaN
console.log(Math.pow(2, Infinity)); //Infinity
console.log(Math.pow(Infinity, 3)); //Infinity
console.log(Math.pow(NaN, 0)); //1
console.log(Math.pow(NaN, 1)); //NaN

雖然Math.pow()已過時,但詠唱著古老的咒語是不是也充滿著神秘力量呢?

「寐偲,砲!」

明天再見啦~

參考資料
MDN-Math.pow()
ECMAScript-Math.pow()
can i use


上一篇
[Day20]-跟妳心思一樣,猜不透的Math.random()
下一篇
[Day22]-我真的愛莫能助...Math.imul()
系列文
如何詠唱JavaScript的Math咒語30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言